// 引入配置
import config from '@/common/config'
import {
	downLoadTaskFile
} from '../common/api';
/* 提示弹窗 */
const msg = (title, duration = 2000, mask = false, icon = 'none') => {
	uni.showToast({
		title,
		duration,
		mask,
		icon
	})
}
// 拨号
const dial = (number) => {
	if (!number) return
	uni.makePhoneCall({
		phoneNumber: number.toString()
	});
}
//  页面返回
const Navback = (num = 1) => {
	let pages = getCurrentPages();
	if (pages.length > 1) {
		uni.navigateBack({
			delta: num
		});
	} else {
		uni.switchTab({
			url: '/pages/index/index'
		})
	}
	// console.log(num);

}
// 页面跳转
const Navto = (url, animationType = 'pop-in', animationDuration = 300) => {
	uni.navigateTo({
		url,
		animationType,
		animationDuration,
		success: function(res) {

		},
		fail: function(e) {

		}
	})
}
/**
 * 获取系统信息
 */
const getSysInfo = () => {
	const sys = uni.getSystemInfoSync();
	const data = {
		top: sys.statusBarHeight,
		height: sys.statusBarHeight + uni.upx2px(90),
		screenHeight: sys.screenHeight,
		platform: sys.platform,
		model: sys.model,
		windowHeight: sys.windowHeight,
		windowBottom: sys.windowBottom,
		deviceId: sys.deviceId
	};
	// // #ifdef MP-WEIXIN || MP-BAIDU || MP-QQ || MP-TOUTIAO || MP-WEIXIN
	// const custom = uni.getMenuButtonBoundingClientRect();
	// data.height = custom.bottom + custom.top - sys.statusBarHeight;
	// // #endif		
	// #ifdef MP-ALIPAY
	data.height = sys.statusBarHeight + sys.titleBarHeight;
	// #endif
	return data;
}

const getMenuButton = () => {
	const menuButton = uni.getMenuButtonBoundingClientRect()

	return menuButton
}
let timeout = null
/**
 * 防抖原理：一定时间内，只有最后一次操作，再过wait毫秒后才执行函数
 *
 * @param {Function} func 要执行的回调函数
 * @param {Number} wait 延时的时间
 * @param {any} data函数传的参数
 * @param {Boolean} immediate 是否立即执行
 * @return null
 */
const debounce = (func, wait = 500, data = undefined, immediate = false) => {
	// 清除定时器
	if (timeout !== null) clearTimeout(timeout)
	// 立即执行，此类情况一般用不到
	if (immediate) {
		const callNow = !timeout
		timeout = setTimeout(() => {
			timeout = null
		}, wait)
		if (callNow) typeof func === 'function' && data ? func(data) : func()
	} else {
		// 设置定时器，当最后一次操作后，timeout不会再被清除，所以在延时wait毫秒后执行func回调方法
		timeout = setTimeout(() => {
			typeof func === 'function' && data ? func(data) : func()
		}, wait)
	}
}

const hidePhoneNumber = (phoneNumber) => {
	// 使用正则表达式进行匹配和替换
	return phoneNumber.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');
}

const timestampToDate = (timestamp) => {
	const date = new Date(timestamp); // JavaScript的时间戳是以毫秒为单位的，所以需要乘以1000
	const year = date.getFullYear();
	const month = ("0" + (date.getMonth() + 1)).slice(-2); // 获取月份，注意月份是从0开始的，所以加1
	const day = ("0" + date.getDate()).slice(-2); // 获取日期，不足两位前面补0

	return `${year}-${month}-${day}`;
}


const regExp = {
	password: /^(?=.*[a-zA-Z])(?=.*\d)[\p{L}\p{N}\p{P}]{8,}/u
}

const downloadFile = (fileUrl, fileName) => {
	// 校验参数
	if (!fileUrl) {
		uni.showToast({
			title: '文件地址为空',
			icon: 'none'
		});
		return;
	}
	fileName = fileName || `文件_${Date.now()}`;

	// 获取文件扩展名
	const fileExtension = fileName.split('.').pop()?.toLowerCase() || '';
	// 补全文件名（如果没有扩展名）
	if (!fileExtension) {
		fileName += '.bin'; // 默认二进制文件后缀
	}

	// 图片格式（支持预览的格式）
	const imageFormats = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'];
	if (imageFormats.includes(fileExtension)) {
		// 图片预览（全平台支持）
		uni.previewImage({
			urls: [fileUrl],
			current: 0,
			success: () => {},
			fail: (err) => {
				console.error('图片预览失败，尝试直接下载:', err);
				// 预览失败时降级为下载
				doDownload(fileUrl, fileName);
			}
		});
		return;
	}
	// 非图片格式，执行下载（适配全平台）
	doDownload(fileUrl, fileName);
};

// 核心下载逻辑（适配App/H5/小程序）
const doDownload = (fileUrl, fileName) => {
	// App/小程序端：用uni.downloadFile + uni.saveFile
	if (process.env.UNI_PLATFORM === 'app-plus' || process.env.UNI_PLATFORM === 'mp-weixin') {
		uni.showLoading({
			title: '下载中...'
		});

		// 下载文件
		uni.downloadFile({
			url: fileUrl,
			timeout: 30000, // 30秒超时
			success: (downloadRes) => {
				uni.hideLoading();
				// 下载成功（状态码200）
				if (downloadRes.statusCode === 200) {
					// 保存文件到本地
					uni.saveFile({
						tempFilePath: downloadRes.tempFilePath,
						success: (saveRes) => {
							// App端提示保存路径，支持打开文件
							if (process.env.UNI_PLATFORM === 'app-plus') {
								uni.openDocument({
									filePath: saveRes.savedFilePath,
									showMenu: true, // 显示右上角菜单（可转发/保存）
									fail: (err) => {
										console.error('打开文件失败:', err);
										uni.showToast({
											title: '下载成功，无法打开该文件格式',
											icon: 'none'
										});
									}
								});
							}
							// 小程序端提示保存成功
							else {
								uni.showToast({
									title: '保存成功，可在"我的文件"中查看',
									icon: 'success'
								});
							}
						},
						fail: (err) => {
							console.error('保存文件失败:', err);
							uni.showToast({
								title: '保存失败',
								icon: 'none'
							});
						}
					});
				} else {
					uni.showToast({
						title: `下载失败（状态码:${downloadRes.statusCode}）`,
						icon: 'none'
					});
				}
			},
			fail: (err) => {
				uni.hideLoading();
				console.error('下载文件失败:', err);
				uni.showToast({
					title: '下载失败，请检查网络',
					icon: 'none'
				});
			}
		});
	}
	// H5端：用原生a标签下载（保留原有逻辑）
	else if (process.env.UNI_PLATFORM === 'h5') {
		try {
			const link = document.createElement('a');
			// 解决H5跨域下载问题（如果接口支持）
			link.href = fileUrl;
			link.download = fileName;
			document.body.appendChild(link);
			link.click();
			document.body.removeChild(link);
			uni.showToast({
				title: '下载已触发',
				icon: 'success'
			});
		} catch (err) {
			console.error('H5下载失败:', err);
			uni.showToast({
				title: '下载失败，请重试',
				icon: 'none'
			});
		}
	}
};

// const fileUrl = 'http://192.168.43.236:8083/fast/sys/comm/fileUploadView?fileId='
// const fileUrl = 'http://192.168.43.78:8083/fast/sys/comm/fileUploadView?fileId='
const fileUrl = '/api/sys/comm/fileUploadView?fileId='

const baseUrl = '/api'
// const baseUrl = 'http://192.168.43.237:8083/fast'
// const baseUrl = 'http://192.168.43.78:8083/fast'

export default {
	downFile(fileName) {
		if (fileName == '' || fileName == undefined) {
			return '';
		}
		if (fileName.indexOf('{') > -1) {
			var obj = JSON.parse(fileName);
			if (obj?.constructor === Object && obj.fileId != undefined) {
				return this.downLoadTaskFile(obj.fileId, obj.taskExampleId);
			}
		}

		if (fileName.indexOf(config.baseUrl) > -1 || fileName.indexOf('http://') > -1 || fileName.indexOf('https://') >
			-1) {
			return fileName;
		}
		return config.baseUrl + '/v1/public/downLoadPic?fileName=' + fileName;
	},
	msg,
	dial,
	Navback,
	Navto,
	getSysInfo,
	getMenuButton,
	debounce,
	hidePhoneNumber,
	timestampToDate,
	regExp,
	fileUrl,
	baseUrl,
	downloadFile


}